package com.jacob.interesting.utils;

import cn.hutool.core.util.StrUtil;
import com.jacob.interesting.enums.inf.NameEnum;
import com.jacob.interesting.enums.inf.RangeEnum;

import java.util.Objects;
import java.util.Optional;

public final class EnumUtils {

    /**
     * 根据枚举值获取枚举
     * @param enums  枚举列表
     * @param value  枚举值
     * @return       枚举
     */
    public static <T> Optional<NameEnum<T>> getByValue(NameEnum<T>[] enums, T value) {
        if (Objects.isNull(value)) {
            return Optional.empty();
        }
        for (NameEnum<T> e : enums) {
            if (value.equals(e.getCode())) {
                return Optional.of(e);
            }
        }
        return Optional.empty();
    }

    /**
     * 根据枚举名称获取对应的枚举
     * @param enums  枚举列表
     * @param name   枚举名
     * @return       枚举
     */
    public static <T> Optional<NameEnum<T>> getByName(NameEnum<T>[] enums, String name) {
        if (StrUtil.isBlank(name)) {
            return Optional.empty();
        }
        for (NameEnum<T> e : enums) {
            if (name.equals(e.getName())) {
                return Optional.of(e);
            }
        }
        return Optional.empty();
    }

    /**
     * 根据值范围获取对应的枚举
     * @param enums  枚举列表
     * @param value  值
     * @return       枚举
     */
    public static <T, R extends Comparable<R>> Optional<RangeEnum<T, R>> getByRange(RangeEnum<T, R>[] enums, R value) {
        if (Objects.isNull(value)) {
            return Optional.empty();
        }
        for (RangeEnum<T, R> e : enums) {
            if (value.compareTo(e.getStart()) >= 0 && value.compareTo(e.getEnd()) <= 0) {
                return Optional.of(e);
            }
        }
        return Optional.empty();
    }

}
